const Topic = require('../models/topics')
const User = require('../models/users');
const Question = require('../models/questions');

class TopicsCtl {

  // 话题是否存在 （中间件）
  async checkTopicExist(ctx, next) {
    const topic = await Topic.findById(ctx.params.id);
    if (!topic) { ctx.throw(404, '话题不存在'); }
    await next();
  }


  // 查找(实现分页)
  async find(ctx) {
    console.log(ctx.query);
    // 默认大小和页码

    const { page_size = 10 } = ctx.query;
    const { page = 1 } = ctx.query
    // 都要除去1 以下的数据
    const currentPage = Math.max(page * 1, 1);
    const pageSize = Math.max(page_size * 1, 1);
    ctx.body = await Topic
      .find({ name: new RegExp(ctx.query.q, 'gi') })
      .limit(pageSize)
      .skip((currentPage - 1) * pageSize);
  }

  // 查找具体的话题
  async findById(ctx) {
    console.log(ctx.path);
    const { fields = '' } = ctx.query;
    const selectFields = fields.split(';').filter(f => f).map(f => ' +' + f).join('');
    const topic = await Topic.findById(ctx.params.id).select(selectFields);
    ctx.body = topic;
  }

  // 新建话题
  async create(ctx) {

    ctx.verifyParams({
      name: { type: 'string', required: true },
      avatar_url: { type: 'string', required: false },
      introduction: { type: "string", required: false }
    })

    // 查询话题是否已存在

    console.log(ctx.request.body);
    const haveOneTopic = await Topic.findOne({ name: ctx.request.body.name.trim() });
    if (haveOneTopic) { ctx.throw(405, '话题已存在'); }

    // 获取并保存
    const topic = await new Topic(ctx.request.body).save();
    ctx.body = topic;
  }

  // 更新话题
  async update(ctx) {
    ctx.verifyParams({
      name: { type: 'string', required: false },
      avatar_url: { type: 'string', required: false },
      introduction: { type: 'string', required: false },
    });
    // 返回的是更新前的
    const topic = await Topic.findByIdAndUpdate(ctx.params.id, ctx.request.body);
    ctx.body = topic;
  }

  // 获取某个话题下的用户列表
  async listFollowers(ctx) {
    const users = await User.find({ followingTopics: ctx.params.id });
    ctx.body = users;
  }

  // 某话题下所属的问题列表（多对多）
  async listQuestions(ctx) {
    const questions = await Question.find({ topics: { $in: [ctx.params.id.trim()] } })
    console.log(ctx.params.id.trim());
    ctx.body = questions
  }
}
module.exports = new TopicsCtl();